public class PutEuropeanPDESOR {

  public static double value(double S0,double K,double r,double sigma, double T,
         int nT,double SMax,int nS,double omega,double tolerancia,int maxIter) {

     //resolver la ecuacion de calor
     double Ttau = T*sigma*sigma/2;
     double XT =  Math.log(SMax/K);
     int nX = nS;
     double k = r/(0.5*sigma*sigma);
     double [][]u=ParabolicPDESOR.solve(1,Ttau,nT, -XT,XT,nX,
         new PutCondicionInicial(k) ,
         new PutCondicionFrontera(k),
         new CondicionFronteraCero(),
         omega,tolerancia,maxIter
     );

     int fin = u.length-1;
     double [] uT= u[fin];
     double dx = (XT+XT) / nX;
     System.out.println(XT);
     System.out.println(uT.length);
     for (int i=0;i<uT.length;i++) {
         double x = -XT+i*dx;
         double S = K*Math.exp(x);
         double alpha = -0.5*(k-1);
         double beta = -0.25*(k+1)*(k+1);
         double v = Math.exp(alpha*x+beta*Ttau)*uT[i];
         double p = K * v;
         System.out.println(x+" "+S+","+p);
     }
     double P=0;
     return P;
  }
}
